<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script type="text/javascript">
      /*
        基本数据类型
          String Number Boolean Null Undefined
        引用数据类型
          Object

        在JS中为我们提供了三个包装类,通过这三个包装类可以将基本类型的数据转换为对象
          String()
            - 可以将基本数据类型字符串转换为String对象,String比较特殊,String对象的方法可以被String基本类型调用,因为会临时转换为包装类型
          Number()
            - 可以将基本数据类型的数字转换为Number对象
          Boolean()
            - 可以将基本数据类型的布尔值转换为Boolean对象

          但是注意:
            我们在实际应用中不会使用基本数据类型的对象,
            如果使用基本数据类型的对象,在做一些比较时可能会带来一些不可预料的问题
            开发中少用包装类!!!!

      */

      //创建一个Number类型的对象
      //num = 3
      var num = new Number(3);
      var str = new String('hello');
      var bool = new Boolean(true);
      var bool2 = true;

      //像num中添加一个属性
      num.hello = 'abcdefg';

      var a = 3;
      a.hello = '你好';

      console.log(num.hello);
      console.log(typeof num);

      console.log(bool == bool2); //true, 这里==做了自动类型转换
      console.log(bool === bool2); //false, 这里===不做自动类型转换

      var b = new Boolean(false); //对象转布尔值都是true

      //这里b为false也运行了
      if (b) {
        alert('b运行了');
      }

      /*
        方法和属性只能添加给对象,不能添加给基本数据类型
          当我们对一些基本数据类型的值去调用属性和方法时,
              浏览器会临时使用包装类将其转换为对象,然后在调用对象的属性和方法。
              调用完以后,在将其转换为基本数据类型

      */
      var s = 123;
      s = s.toString();

      s.hello = '你好';

      // var test = new Object();

      // test.sayName = function () {
      //   console.log('测试~');
      // };

      // test.sayName();

      function Person() {}

      var person = new Person();

      person.__proto__;

      console.log(s.hello); //undefined
    </script>
  </head>
  <body></body>
</html>
